<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /* 
    1. 如何理解/证明函数也对象?
      - 证明: instanceof 为 true
      - 函数有对象的所有特性: 属性与方法
        - 可以调用/执行
        - 有特有的属性: prototype
        - 有特有的方法: call()/apply()/bind()
    2. 区别实例对象与函数对象?
      - 实例对象: new构造函数产生对象  ==> 简称 对象
      - 函数对象: 将函数作为对象使用时称为函数对象
    3. 区别方法与属性?
      - 方法是一种特别的属性, 特别之处是属性值是函数
      - 什么属性才称为方法: 当属性值为函数时我们称之为方法
    4. 区别方法与函数?
      - 定义在对象中的或通过对象调用的 ==> 方法
      - 不是在对象中定义 / 不通过对象调用  ==> 函数
    5. 判断是回调函数的3个条件?
      - 我们定义的
      - 我们没有直接调用
      - 在某个时刻或条件下会执行
    6. 回调函数需要确定的3个问题?
      - 什么时候调用?
      - 用来做什么的?
      - this是谁?
    7. 区别函数的定义和函数的执行
      执行函数定义: 创建函数对象/原型对象/函数名变量
      执行函数: 执行函数体中的语句
      执行函数定义是执行函数的前提
    */


    fn()
    function fn() {
      
    }


  //  div.onclick = function () {}

  //  function fn() {
  //    console.log("fn")
  //  }
  //  console.log(fn instanceof Object) // true
  //  console.log(fn.__proto__, fn.toString())
  //  fn.xxx = 123
  //  fn.test = function () {
     
  //  }
  //  fn.test()
  //  fn.call({}) // 从语法上说fn此时是一个对象, 从功能上来说fn是函数


  //  const obj = {
  //    a: 1,
  //    b: 2,
  //    test: function () {}
  //  }
  //  obj.test()

  //  function fn2() {
     
  //  }
  //  fn2()
  //  window.fn2()
  //  new fn2()

  //  setTimeout(() => {
     
  //  }, 1000)
  //  ;[1, 2, 4].forEach((item, index) => {

  //  })

  </script>
</body>
</html>